package com.lee.forum.controller;

import com.lee.forum.common.AppResult;
import com.lee.forum.exception.ApplicationException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lishuo
 * Date: 2023-09-25
 * Time: 19:46
 */
// API 描述信息
@Api(tags = "TestController 测试接⼝")
@RestController
@RequestMapping("/test")
public class TestController {

    // API ⽅法描述
    @ApiOperation(value = "测试接⼝1，打印hello")
    @GetMapping("/hello")
    public String hello() {
        return "hello forum!";
    }

    // API ⽅法描述
    @ApiOperation(value = "测试接⼝2，返回一个自定义异常结果")
    @GetMapping("/appexception")
    public AppResult appexcep() {
        throw new ApplicationException("applicationException . . .");
    }

    // API ⽅法描述
    @ApiOperation(value = "测试接⼝3，返回一个全局异常结果")
    @GetMapping("/exception")
    public AppResult excep() throws Exception {
        throw new Exception("exception . . .");
    }

    // API ⽅法描述(@ApiParam ⽅法参数的注解，⽤来描述参数)
    @ApiOperation(value = "测试接⼝4，返回 你好+传⼊参数")
    @PostMapping("helloname")
    public AppResult helloname(@ApiParam("姓名") @RequestParam("name") String name) {
        return AppResult.success("你好："+name);
    }

// 优化空间：
// 1.很多功能都可以再完善一下，比如可以增加一个评论的楼中楼功能，增加一个全局搜索功能
// 2.前端页面做一个接口集成，后端使用多线程进行处理，可减少tcp握手次数，同时多线程可提高查询效率
// 3.使用了redis，但是存在双写一致问题
// 4.点赞这种高频事件，给他优化到redis中实现，不然每次都要访问数据库，数据库压力山大

// 亮点：
// 1.使用md5+扰动字符实现了更安全的加密算法
// 2.使用了拦截器进行登录校验，异常也使用了全局处理
// 3.项目中集成了redis实现了文章热榜功能
// 4.使用websocket实现了网页实时通信功能，并且使用RabbitMQ完成消息的异步存储

// 难点：
// 1.就是在前后端接口交互的时候，因为你也不知道前端会传什么样的参数，所以在进行校验的时候一定要考虑到各种情况，什么为空不为空，必传非必传，
// 并且有些参数还要根据你接口的具体业务进行更详细的校验，比如一个回复帖子的接口，首先不能给自己回复，回复人得存在，不能被禁言等等情况，
// 并且涉及到接口联调的情况，还要保证数据的一致性，需要使用事务
// 2.redis进行数据存储，的时候，数据结构的选择
// 3.使用websocket进行实时通信比较难实现，既需要设计消息格式，又要定义转发规则，以及对消息的持久化也要分情况考虑

// 印象深刻的地方：
// 1.上传图片的时候，图片名和映射地址
// 2.数据库注册用户数量暴增，项目上线的时候被恶意通过脚本注册了（增加验证码功能，一定程度上防止）
// 3.数据库时间和前端显示时间不一致（Json进行序列化的时候对Data类型默认使用的是GMT时区，刚好慢8个小时）
//
}
